Skip to main content

CNC の例 10: 動的 CNC パスのプログラミング

を参照してください CNC10_DynamicPath.project のインストールディレクトリにあるサンプルプロジェクト CODESYS..\CODESYS SoftMotion\Examples.

この例では、CNC プログラム オブジェクトまたはファイルから G コードを入力せずに、実行時にアプリケーションで CNC パスを直接作成する方法を示します。この種の従来の CNC プログラムをコンパイルすると、パス データは SMC_CNC_Data データ構造タイプ。この内部データは、コンパイル モードに応じて特定のグローバル データ構造にコンパイルされます (SMC_CNC_REF また SMC_OutQueue)。

コンパイルモードの場合 SMC_CNC_REF、データはの配列に格納されます SMC_GEOINFO 要素。アプリケーションコードの配列は通常、関数ブロックインスタンスに渡されます SMC_NCDecoder。実行時に、データはそこでデコードされ、タイプのグローバルデータ構造に格納されます SMC_OUTQUEUE。次に、パス前処理機能ブロックを呼び出すことができます。

コンパイルモードの場合 SMC_OutQueue、グローバルデータ構造(SMC_OUTQUEUE)が生成されます 直接。アプリケーションコード内のこのデータ構造は、補間器に渡されます(SMC_Interpolator FBインスタンス)。機能ブロック SMC_NCDecoder は呼び出されません。

コンパイルモードの場合 ファイル、データはファイルに保存されます。データは、タイプの要素の配列として格納されます SMC_GEOINFO コンパイルモードで生成されたデータに対応します SMC_CNC_REF

CNCパスをプログラミングする代わりに、タイプのデータ構造をインスタンス化するアプリケーションコードをプログラミングできます。 SMC_OUTQUEUE 実行時に、その値を割り当てます。実行時に動的に生成されるCNCパスをプログラムします。データ構造を他の汎用ブロックインスタンス(たとえば、パス前処理汎用ブロックまたは汎用ブロック)に渡すことができます。 SMC_Interpolator)。

プログラミング

ヒント

The CNCDynamicPath サンプルプロジェクトは、のインストールディレクトリにあります。 CODESYS。サンプルプロジェクトは、 CNConline 事業。それは含まれています Path グラフィカルにプログラムされた代わりにプログラム Example 道。タイプのデータ構造 SMC_OUTQUEUE 動的に生成されます。

. 宣言:
  • タイプのデータ構造を宣言します SMC_OUTQUEUE。データ構造にはCNCパスデータが含まれており、動的に入力されます。

    例: QUEUE

  • 必要な量のパスにメモリを割り当てます。 SMC_GEOINFO 要素。

    例: BUF

  • タイプの変数を宣言します SMC_GEOINFO 最初のステップで。

    例: GEO

. 実装:
  • データ型の配列要素 SMC_GEOINFO CNCコードのパス要素に対応します。要素をに追加するには、要素ごとに次の手順を実行する必要があります。 SMC_OUTQUEUE

  • すべての配列要素には、前の配列要素の終了位置に対応する開始位置があります。

    例: GEO.piStartPos.dX := 0; また GEO.piStartPos := GEO.piDestPos;

  • 各配列要素の移動タイプを決定します。

    例: GEO.iMoveType := CCLW; また GEO.iMoveType := LIN;

  • 移動タイプのパラメータを設定します。これは、すべての移動タイプに必要なわけではありません。

    例:円弧(移動タイプ:CCLW)の場合、次の位置を設定する必要があります。 geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;

  • 終了位置の計算を挿入します。

    SMC_CalcEndPnt(ADR(GEO));

  • オブジェクトの長さの計算を挿入します。

    SMC_CalcLengthGeo(ADR(GEO));

  • オブジェクトをに保存します QUEUE

    SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));

パスが完全に作成されたら、終了マーカーを設定する必要があります。 QUEUE-bEndOfList = TRUE;

ヒント

次に、パス前処理機能ブロックが呼び出されると、の開始ビットまたは終了ビットを設定する必要があります。 InternMark

50.

2つのパス要素を持つCNCパス

この例では、配列はX / Y位置で定義されていません。説明したようにこれが2つのパス要素を持つ例である場合、これらの配列にはそれぞれ2つの要素が必要です。

たとえば、サンプルプロジェクトから派生したもの:

xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
        iState : INT;
        QUEUE : SMC_OUTQUEUE;
        BUF : ARRAY[0..49] OF SMC_GEOINFO;
                // Memory allocation
        GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
                // Initial path element
        n : INT := 0;
        QUEUE.nSize := SIZEOF(BUF);
END_VAR

CASE iState OF
0:
        QUEUE.pbyBuffer := ADR(BUF[0]);
                // Initialize QUEUE
        SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
        iState := iState + 1;

1:
        // Fill QUEUE
        WHILE NOT QUEUE.bFull DO
                // When QUEUE is full, wait until it has been processed by the following FBs
                n := n + 1;
                GEO.iSourceLine_No := n;
                GEO.piStartPos := GEO.piDestPos;
                        // Copying last destination
                GEO.iMoveType := LIN;
                        // Generating linear movement
                GEO.iObjNo := GEO.iObjNo + 1;
                        // Calculating number
                GEO.piDestPos.dX := xp[n];
                        // Generatint position
                GEO.piDestPos.dY := yp[n];
                SMC_CalcLengthGeo(pg := ADR(GEO));
                        // Calculating length of object with the help of the standard function
                SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
                        // Appending object to QUEUE
                IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
                        // All target positions processed
                        QUEUE.bEndOfList := TRUE;
                        n := 0;
                        iState := 2;
                        EXIT;
                END_IF
        END_WHILE

2:
        //Done
        ;
END_CASE

CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing


重要

の場合 SMC_OUTQUEUE データ構造には次のデータが入力されます SMC_GEOINFO データとデータ構造要素がに設定されました bFULL = TRUE、その後の割り当てはお勧めしません SMC_GEOINFO データ。この場合、パスの作成は、実行時に、の最初の要素まで中断されます。 SMC_OUTQUEUE データ構造は補間器で処理されます。その場合にのみ、別の要素が挿入されます。

十分なメモリを割り当てることにより、この中断を回避してください。変数を参照してください BUF

重要

データ構造の場合 SMC_OUTQUEUE 最初の実行後に補充され、次に補間器とすべての前処理機能ブロックが補充されます(例: SMC_CheckVelocities)で立ち上がりエッジで再起動する必要があります Execute